package com.hdrx.fundhelper.utils;


import com.hdrx.fundhelper.dao.pojo.User;
import com.hdrx.fundhelper.dao.pojo.Userinfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * @author: houdx
 * @description: 判断  字符串或者包装类  对象中部分属性值 工具类
 * @date: 2023/6/15 16:27
 */
@Slf4j
public class PropertyUtils {
    /**
     * 判断对象中部分属性值是否不为空，存在不为空返回true，为空返回false
     *
     * @param object            对象
     * @param excludeFieldNames 选择忽略校验的属性名称List集合
     * @return
     */
    public static boolean checkObjFieldsIsNotNull(Object object, List<String> excludeFieldNames) {
       log.info("object信息>>>>>>>>>"+object);
        if (null == object) {
            return false;
        }
        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                //由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
                f.setAccessible(true);
                //获取对象属性名，如username
                log.info("对象属性名f.getName()..........." + f.getName());
                //获取对象属性值，如 hdx
                log.info("对象属性值f.get(object).........." + f.get(object));
                //除了忽略的属性，存在不为空，不为null返回true
                if (!excludeFieldNames.contains(f.getName()) && f.get(object) != null && StringUtils.isNotBlank(f.get(object).toString())) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 判断对象中属性值是否存在为空，存在返回true，不存在返回false
     *
     * @param object            对象
     * @param excludeFieldNames 选择忽略校验的属性名称List集合
     * @return
     */
    public static boolean checkObjFieldsIsIsNull(Object object, List<String> excludeFieldNames) {
        if (null == object) {
            return true;
        }
        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                //由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
                f.setAccessible(true);
                //获取对象属性名，如username
                log.info("f.getName()..........." + f.getName());
                //获取对象属性值，如 hdx
                log.info("对象属性值f.get(object).........." + f.get(object));
                //除了忽略的属性，存在为空，返回true
                if (!excludeFieldNames.contains(f.getName()) && (f.get(object) == null || StringUtils.isBlank(f.get(object).toString()))) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判断属性是否为null或""
     * @param args
     * @return 是则返回 true
     */
   /* public static Boolean isEmpty(Object ...args){
        for (Object arg : args) {
            if(arg instanceof String){
                String s = String.valueOf(arg);
                if(StringUtils.isEmpty(s)) {
                    return true;
                }
            }else {
                if(arg == null) {
                    return true;
                }
            }
        }
        return false;
    }*/


    /**
     *判断对象的属性是否为空
     * @param obj 传入的对象
     * @return 是返回 true
     */
    public static Boolean PropertyIsEmpty(Object obj) {
        if (null == obj){
            return true;
        }
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                Object o = field.get(obj);
                if(o == null){
                    return true;
                }
                if(o instanceof String){
                    if("".equals(o) || StringUtils.isBlank(o.toString())) {
                        return true;
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    }


    public static void main(String[] args) {
        User user = new User();
        user.setUsername("w");
        System.out.println(PropertyUtils.checkObjFieldsIsNotNull(user, Arrays.asList("username")));

        Userinfo userinfo1 = new Userinfo();
        userinfo1.setUserId(1).setPassword("2").setAge(24).setUserName("hdx");
        System.out.println(checkObjFieldsIsIsNull(userinfo1,new ArrayList<>()));

    }

}
